package org.example.util;


import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import org.junit.Assert;
import org.junit.Test;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBUtil {

    /**
     * 1.封装获取数据库连接：
     * 一个连接池（单例模式）
     * 通过同一个连接池，获取不同的连接对象
     */
    private static volatile DataSource DS;

    private static DataSource getDataSource(){
        if(DS == null){
            synchronized (DBUtil.class){
                if(DS == null){
                    MysqlDataSource ds = new MysqlDataSource();
                    ds.setURL("jdbc:mysql://localhost:3306/blog_java44");
                    ds.setUser("root");//账号
                    ds.setPassword("1433223");//密码
                    ds.setUseSSL(false);//不设置会出现红色的警告，也没事
                    //数据库的编码格式，可以设置为UTF-8，或是utf8
                    ds.setCharacterEncoding("utf8");
                    DS = ds;
                }
            }
        }
        return DS;
    }

    //提供一个开放出来给jdbc操作的代码使用的工具方法：获取连接对象
    public static Connection getConnection(){
        try {
            return getDataSource().getConnection();
        } catch (SQLException e) {
            throw new RuntimeException("获取数据库连接失败，检查url，账号密码", e);
        }
    }

    /**
     * 释放资源：反向释放结果集对象，操作命令对象，连接对象
     * 这三个对象都可能为空，需要判断：创建对象之前就抛异常，对象就为空
     */
    public static void close(Connection c, Statement s, ResultSet rs){
        try {
            if(rs != null) rs.close();
            if(s != null) s.close();
            if(c != null) c.close();
        } catch (SQLException e) {
            throw new RuntimeException("jdbc释放资源出错", e);
        }
    }

    /**
     * 释放资源的重载方法：
     * 三个参数，是查询操作，需要释放的
     * 2个参数，是插入/修改/删除，需要释放的
     */
    public static void close(Connection c, Statement s){
        close(c, s, null);
    }

    //@Test是单元测试注解，可以直接运行（public void）
    @Test
    public void test(){
        //Assert.assertXXX 表示断言（判断是否正确）必须返回true表示单元测试通过，否则失败
        Assert.assertNotNull(getConnection());
//        System.out.println(getConnection());
    }

}